var BaseUtil=require('./basic');
/**
 * 数组帮助类
 */
var ArrayUtil ={
  /**
   * 返回数组的最后一个对象
   * @param {Array} array 数组或者类似于数组的对象.
   * @return {*} 数组的最后一项.
   */
  peek : function(array) {
    return array[array.length - 1];
  },
  /**
   * 查找记录所在的位置
   * @param  {*} value 值
   * @param  {Array} array 数组或者类似于数组的对象
   * @param  {Number} [fromIndex=0] 起始项，默认为0
   * @return {Number} 位置，如果为 -1则不在数组内
   */
  indexOf : function(value, array,opt_fromIndex){
     var fromIndex = opt_fromIndex == null ?
        0 : (opt_fromIndex < 0 ?
             Math.max(0, array.length + opt_fromIndex) : opt_fromIndex);

    for (var i = fromIndex; i < array.length; i++) {
      if (i in array && array[i] === value)
        return i;
    }
    return -1;
  },
  /**
   * 数组是否存在指定值
   * @param  {*} value 值
   * @param  {Array} array 数组或者类似于数组的对象
   * @return {Boolean} 是否存在于数组中
   */
  contains : function(value,array){
    return ArrayUtil.indexOf(value,array) >=0;
  },
  /**
   * 2个数组内部的值是否相等
   * @param  {Array} a1 数组1
   * @param  {Array} a2 数组2
   * @return {Boolean} 2个数组相等或者内部元素是否相等
   */
  equals : function(a1,a2){
    if(a1 == a2){
      return true;
    }
    if(!a1 || !a2){
      return false;
    }

    if(a1.length != a2.length){
      return false;
    }
    var rst = true;
    for(var i = 0 ;i < a1.length; i++){
      if(a1[i] !== a2[i]){
        rst = false;
        break;
      }
    }
    return rst;
  },

  /**
   * 数组是否为空
   * @param  {Array}  array 数组
   * @return {Boolean}  是否为空
   */
  isEmpty : function(array){
    return array.length == 0;
  },
  /**
   * 插入数组
   * @param  {Array} array 数组
   * @param  {Number} index 位置
   * @param {*} value 插入的数据
   */
  add : function(array,value){
    array.push(value);
  },
  /**
   * 将数据插入数组指定的位置
   * @param  {Array} array 数组
   * @param {*} value 插入的数据
   * @param  {Number} index 位置
   */
  addAt : function(array,value,index){
    ArrayUtil.splice(array, index, 0, value);
  },
  /**
   * 清空数组
   * @param  {Array} array 数组
   * @return {Array}  清空后的数组
   */
  empty : function(array){
    if(!(array instanceof(Array))){
      for (var i = array.length - 1; i >= 0; i--) {
        delete array[i];
      }
    }
    array.length = 0;
  },
  /**
   * 移除记录
   * @param  {Array} array 数组
   * @param  {*} value 记录
   * @return {Boolean}   是否移除成功
   */
  remove : function(array,value){
    var i = ArrayUtil.indexOf(value, array);
    var rv;
    if ((rv = i >= 0)) {
      ArrayUtil.removeAt(array, i);
    }
    return rv;
  },
  /**
   * 移除指定位置的记录
   * @param  {Array} array 数组
   * @param  {Number} index 索引值
   * @return {Boolean}   是否移除成功
   */
  removeAt : function(array,index){
    return ArrayUtil.splice(array, index, 1).length == 1;
  },
  /**
   * @private
   */
  slice : function(arr, start, opt_end){
    if (arguments.length <= 2) {
      return Array.prototype.slice.call(arr, start);
    } else {
      return Array.prototype.slice.call(arr, start, opt_end);
    }
  },
  /**
   * @private
   */
  splice : function(arr, index, howMany, var_args){
    return Array.prototype.splice.apply(arr, ArrayUtil.slice(arguments, 1))
  }

};

module.exports=ArrayUtil;
